/**
 * 在这里定义和用户相关的路由处理函数，供 /router/user.js 模块进行调用
 */
// 导入数据库模块
const db = require('../db/index') 
// 导入 bcryptjs -- 对密码进行加密处理
const bcrypt = require('bcryptjs')
// 生成 JWT 的 Token 字符串
const jwt = require('jsonwebtoken')
const config = require('../config')
// 自动生成随机id
const { v4: uuidv4 } = require('uuid')


// 注册用户--处理函数
exports.regUser = (req,res) => {
  // 通过 req.query 获取客户端通过查询字符串，发送到服务器的数据
  const data  = req.body

  if (data.username === '' || data.password === '') {
    return res.send({ success: false,status: 10000, msg: '用户名或密码不能为空！' })
  }
  
  // 定义SQL语句，查询用户名是否被占用
  const sqlA = 'select * from users where username=?'

  db.query(sqlA,[data.username],(err,results)=> {
    // 执行SQL语句失败
    if (err) return res.send( { success: false,status: 10000, msg: err.message  } )
    // 验证用户名是否被占用
    if(results.length > 0) return res.send( { success: false,status: 10000, msg: '用户名已被占用，请更换其他用户名！'  } )
    
    // 生成唯一的UUID
    const userId = uuidv4()
    // 对用户密码进行加密 -- bcrypt.hashSync(明文密码，随机盐的长度)
    data.password = bcrypt.hashSync(data.password,15)
    // 插入新用户
    const sqlB = 'insert into users set ?'
    const userData = { 
      id: userId,
      username: data.username,
      password: data.password,
      agreement: data.agreement,
      createDate: new Date(), // 创建时间
    }
    db.query(sqlB,userData,function(err,results){
      // 执行失败
      if(err) res.send({ success: false,status: 10000, msg: err.message })

      // SQL语句执行成功，但影响行数不为1 
      if(results.affectedRows !== 1){
        return res.send({ status: 1 ,message: '注册用户失败，请稍后再试！'})
      }
      res.send({ status: 200,msg: '用户注册成功！',success: true })
    })
  })
}

// 登录 -- 处理函数
exports.loginUser = (req,res)=>{
  const userInfo = req.body

  // 根据用户名查询用户数据
  const sql = 'select * from users where username=?'
  db.query(sql,userInfo.username,function(err,results){
    
    // 执行SQL语句失败
    if(err) return res.send( { success: false,status: 10000, msg: err.message  } )
    // 执行SQL语句成功，但是查询到数据不等于1
    if (results.length !== 1)  return res.send( { status: 10000, msg: '未注册用户！'  } )
    // 判断密码是否正确
    // bycrypt.compareSync(用户提交的密码,数据库中的密码) 比较密码是否一致
    const compareResult = bcrypt.compareSync(userInfo.password,results[0].password)
    if(!compareResult) return res.send( { success: false,status: 10000, msg: '姓名或密码错误！'  } )

    // 登录成功，生成Token字符串
    // 生成JWT的token字符串，一定要剔除密码和头像的值
    // 通过ES6的高级语法，快速剔除密码和头像
    const userData = { ...results[0],password: '',user_pic: '' }
    // 生成JWT的token字符串
    const tokenStr = jwt.sign(userData,config.jwtSecretKey,{
      expiresIn: '12h',  // token的有效期
    })
    res.send({
      id: results[0].id,
      status: 200,
      msg: '登录成功！',
      token: 'Bearer' + tokenStr,
      success: true,
      data: results[0]
    })
  })
}

// 修改密码 -- 处理函数
exports.editPassword = (req,res) => {
  const data = req.body
  // 对用户密码进行加密 -- bcrypt.hashSync(明文密码，随机盐的长度)
  data.password = bcrypt.hashSync(data.password,15)

  // 检查用户是否已经注册
  const sqlA = 'select * from users where username=?'
  db.query(sqlA,[data.username],(err,results)=>{

    if(err) return res.send({ success: false,status: 10000, msg: err.message })
    // 
    if(results.length === 0) return res.send({ success: false,status: 10000, msg: '用户未注册！' })

    // 执行sql更新用户信息
    const sqlB = 'update users set password=? where username=?'
    // [要修改的值,关键值]
    db.query(sqlB,[data.password,data.username],(err,results)=>{
      // 失败
      if(err) return res.send({ success: false,status: 1000, msg: err })

      if(results.affectedRows === 1) 
        return res.send({ 
          status: 200,
          msg: '修改成功！',
          success: true,
        })

    })

  })



}




